<html>
    <head>
        <title>设置管理模块</title>
    </head>
    <body>
        <script>
            // 设置管理模块 

                  /*
                        置管理模块实现 ISettingStore（参见设置系统）将设置值存储在数据库中，并提供 ISettingManager(设置管理器服务) 来管理（更改）数据库中的设置值。

                        已经为启动模板安装和配置了设置管理模块。因此，大多数时候您不需要手动将此模块添加到您的应用程序中。
                  */    
                 
                  /*
                        一、 ISettinigManager  设置管理器


                                1、如何获取和设置Setting 值？

                                                ISettingManager用于"获取" 和 "设置" 设置的值。
                                                
                                                例子：

                                                                using System;
                                                                using System.Threading.Tasks;
                                                                using Volo.Abp.DependencyInjection;
                                                                using Volo.Abp.SettingManagement;

                                                                namespace Demo
                                                                {
                                                                    public class MyService : ITransientDependency
                                                                    {
                                                                        private readonly ISettingManager _settingManager;

                                                                        // 注入 ISettingManager 服务
                                                                        public MyService(ISettingManager settingManager)
                                                                        {
                                                                            _settingManager = settingManager;  // 注入设置管理器服务
                                                                        }

                                                                        public async Task FooAsync()
                                                                        {
                                                                            Guid user1Id = ...;
                                                                            Guid tenant1Id = ...;

                                                                            // 为当前用户(或指定的特定用户)获取和设置某个设置值
                                                                            string layoutType1 = await _settingManager.GetOrNullForCurrentUserAsync("App.UI.LayoutType"); // 获取当前用户的设置值
                                                                            string layoutType2 = await _settingManager.GetOrNullForUserAsync("App.UI.LayoutType", user1Id); // 获取特定用户的设置值

                                                                            await _settingManager.SetForCurrentUserAsync("App.UI.LayoutType", "LeftMenu"); // 设置当前用户的设置值
                                                                            await _settingManager.SetForUserAsync(user1Id, "App.UI.LayoutType", "LeftMenu"); // 设置特定用户的设置值

                                                                            // 为当前租户(或者特定租户)获取和设置某个设置值
                                                                            string layoutType3 = await _settingManager.GetOrNullForCurrentTenantAsync("App.UI.LayoutType");  // 获取当前租户的设置值
                                                                            string layoutType4 = await _settingManager.GetOrNullForTenantAsync("App.UI.LayoutType", tenant1Id); // 获取特定租户的设置值
                                                                            
                                                                            await _settingManager.SetForCurrentTenantAsync("App.UI.LayoutType", "LeftMenu"); // 设置当前租户的设置值
                                                                            await _settingManager.SetForTenantAsync(tenant1Id, "App.UI.LayoutType", "LeftMenu"); // 设置特定租户的设置值

                                                                            // 获取全局/默认设置值
                                                                            string layoutType5 = await _settingManager.GetOrNullGlobalAsync("App.UI.LayoutType"); // 获取全局设置值
                                                                            string layoutType6 = await _settingManager.GetOrNullDefaultAsync("App.UI.LayoutType"); // 获取默认设置值

                                                                            await _settingManager.SetGlobalAsync("App.UI.LayoutType", "TopMenu"); // 设置全局设置值

                                                                        }
                                                                    }
                                                                }

                                                    因此，您可以为不同的设置值提供者（默认、全局、用户、租户…等）获取或设置设置值。

                                2、Setting 缓存

                                            设置值使用分布式缓存系统进行缓存。始终使用ISettingManager更改为您管理缓存的设置值。

                  */


                  /*
                        二、设置管理提供商   Setting Management Providers

                            设置管理提供程序允许你为设置值提供者（默认、全局、用户、租户…等）获取或设置设置值。


                                    设置管理模块是可扩展的，就像设置系统一样。

                                    您可以通过定义设置管理提供程序来扩展它。

                                    有5个预构建的设置管理提供程序按以下顺序注册：

                                           ①、 DefaultValueSettingManagementProvider：从设置定义的默认值中获取值。它不能设置默认值，因为默认值是硬编码在设置定义上的。

                                           ②、 ConfigurationSettingManagementProvider：从IConfiguration服务获取值。它无法设置配置值，因为无法在运行时更改配置值。

                                           ③、 GlobalSettingManagementProvider：获取或设置设置的全局（系统范围）值。

                                           ④、 TenantSettingManagementProvider：获取或设置租户的设置值。

                                           ⑤、 UserSettingManagementProvider：获取用户的设置值。

                                    ISettingManager使用get/set方法上的设置管理提供程序。

                                    通常，每个设置管理提供程序都在ISettingManagement服务上定义扩展方法（如用户设置管理提供程序定义的SetForUserAsync）。

                                    如果要创建自己的提供程序，请实现ISettingManagementProvider接口或从SettingManagementProvider基类继承：
                                    
                                            public class CustomSettingProvider : SettingManagementProvider, ITransientDependency
                                            {
                                                public override string Name => "Custom";

                                                public CustomSettingProvider(ISettingManagementStore store) 
                                                    : base(store)
                                                {
                                                }
                                            }

                                    SettingManagementProvider基类为您创建默认实现（使用ISettingManagementStore）。
                                    您可以根据需要覆盖基本方法。
                                    每个提供程序都必须有一个唯一的名称，在本例中为Custom（保持简短，因为它保存到每个设置值记录的数据库中）。
                  */
        </script>
    </body>
</html>